FireLens(Fluent Bit)からCloudWatch Logsのログ保持期間を設定したがタスクロールの権限不足により失敗したときの対応方法
Fluent BitのCloudWatch Logsプラグインを利用し、Fluent BitからCloudWatch Logsのロググループ、ログストリームを作成していました。CloudWatch Logsのログ保持期限もFluent Bitの設定ファイルから指定できます。だけど、タスクロールの権限不足で失敗したときのエラーと対応内容を紹介します。
Fluent Bitコンテナのログより、エラーメッセージ
PutRetentionPolicy API responded with error='AccessDeniedException'
-
Icons made by Freepik from www.flaticon.com
原因と対応結果
- タスクロールに必要なポリシー
log:PutRetentionPolicy
が足りていない - タスクロールへ権限追加後、新規のFluent Bitコンテナ起動でログ保持期限の設定追加に成功した
状況確認
FireLensはアプリケーションコンテナに対してログルーティング機能を提供するFluent Bitまたは、Fluentdを起動できます。サイドカーパターンで起動します。 FireLensによりログルーティングを行うFluent Bitコンテナを準備しました。以下はFluent BitのDockerfileと、設定ファイルの内容です。
項目 | バージョン |
---|---|
aws-for-fluent-bit | 2.21.1 |
Fluent Bit | 1.8.9 |
Fargate platform | 1.4.0 |
FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:2.21.1 COPY ./extra.conf /fluent-bit/etc/extra.conf
ロググループの自動作成と、ログ保持期限を30日を指定しました。
[SERVICE] Flush 1 Grace 30 [OUTPUT] Name cloudwatch_logs Match *-firelens-* region ap-northeast-1 log_group_name /sample5-dev-web-error-logs log_stream_prefix fluentbit- auto_create_group true log_retention_days 30
FargateでFireLensを含むタスクを起動します。Fluent Bitコンテナ起動によりロググループが新規作成されました。しかし、retentionInDays
の項目がなく保持期限30日設定されていません。
$ aws logs describe-log-groups --log-group-name-prefix /sample5-dev-web-error-logs --outpu table ------------------------------------------------------------------------------------------------------------- | DescribeLogGroups | +-----------------------------------------------------------------------------------------------------------+ || logGroups || |+-------------------+-------------------------------------------------------------------------------------+| || arn | arn:aws:logs:ap-northeast-1:123456789012:log-group:/sample5-dev-web-error-logs:* || || creationTime | 1636805554034 || || logGroupName | /sample5-dev-web-error-logs || || metricFilterCount| 0 || || storedBytes | 0 || |+-------------------+-------------------------------------------------------------------------------------+|
Fluent Bitのログ確認
-
Icons made by Freepik from www.flaticon.com
Fluent Bitではアプリケーションコンテナのログをルーティングします。Fluent Bitコンテナ自体のログをCloudWatch Logsに保存できます。CloudWatch LogsからFluent Bitのログを確認すると以下のエラーを確認できました。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | timestamp | message | |---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ...snip... | 1636805554058 | [2021/11/13 12:12:34] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Setting retention policy on log group /sample5-dev-web-error-logs to 30d | | 1636805554064 | [2021/11/13 12:12:34] [error] [aws_client] auth error, refreshing creds | | 1636805554064 | [2021/11/13 12:12:34] [error] [aws_credentials] Shared credentials file /root/.aws/credentials does not exist | | 1636805554064 | [2021/11/13 12:12:34] [error] [output:cloudwatch_logs:cloudwatch_logs.0] PutRetentionPolicy API responded with error='AccessDeniedException' | | 1636805554064 | [2021/11/13 12:12:34] [error] [output:cloudwatch_logs:cloudwatch_logs.0] Failed to putRetentionPolicy | ...snip... --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PutRetentionPolicy
がAccessDeniedException
となっています。つまり、ログ保持期限を設定する権限が不足しています。ここで必要な権限はタスク実行ロールではなくタスクロールの方です。
タスクロールの権限確認
タスクロールにアタッチしているIAMポリシーを確認します。SentCloudWatchLogsPolicy
という名前のポリシーを設定していました。
$ aws iam list-attached-role-policies --role-name sample5-dev-web-ECSTaskRole --output table ------------------------------------------------------------------------------------------------------------------------------- | ListAttachedRolePolicies | +-----------------------------------------------------------------------------------------------------------------------------+ || AttachedPolicies || |+-----------------------------------------------------------------------------+---------------------------------------------+| || PolicyArn | PolicyName || |+-----------------------------------------------------------------------------+---------------------------------------------+| || arn:aws:iam::123456789012:policy/sample5-dev-ECSExecPolicy | sample5-dev-ECSExecPolicy || || arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy | sample5-dev-SentCloudWatchLogsPolicy || || arn:aws:iam::123456789012:policy/sample5-dev-SentKinesisDataFirehosePolicy | sample5-dev-SentKinesisDataFirehosePolicy || |+-----------------------------------------------------------------------------+---------------------------------------------+|
先にDefaultVersionId
を確認します。次のコマンドの引数に--version-id
で指定が必要なためです。
$ aws iam get-policy --policy-arn arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy { "Policy": { "PolicyName": "sample5-dev-SentCloudWatchLogsPolicy", "PolicyId": "ANPAQ4BT4DHFKO4OTAK4J", "Arn": "arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy", "Path": "/", "DefaultVersionId": "v1", "AttachmentCount": 1, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "CreateDate": "2021-11-06T07:58:58+00:00", "UpdateDate": "2021-11-06T07:58:58+00:00", "Tags": [] } }
PutRetentionPolicy
がありませんでした。 Fluent Bitのエラーメッセージ通り権限不足ですね。
$ aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy --version-id v1 { "PolicyVersion": { "Document": { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:*", "Effect": "Allow" } ] }, "VersionId": "v1", "IsDefaultVersion": true, "CreateDate": "2021-11-06T07:58:58+00:00" } }
対応
必要なIAMポリシー追加しました。logs:PutRetentionPolicy
が追加されています。IAMポリシーを追加したためバージョンが繰り上がっています。IAMポリシーを確認するときの引数--vesion-id
も変更必要です。
$ aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy --version-id v2 { "PolicyVersion": { "Document": { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:DescribeLogStreams", "logs:PutLogEvents", "logs:PutRetentionPolicy" ], "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:*", "Effect": "Allow" } ] }, "VersionId": "v2", "IsDefaultVersion": true, "CreateDate": "2021-11-13T13:25:27+00:00" } }
Fluent BitのログからはFluent Bitが起動時にCloudWatch Logs設定をしているようにみえるため、タスク強制デプロイし新しいFluent Bitコンテナを起動させました。
Fluent Bitのログを確認します。今度はSet retention policy to 30
のメッセージを確認でき成功しています。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | timestamp | message | |---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ...snip... | 1636810542604 | [2021/11/13 13:35:42] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Setting retention policy on log group /sample5-dev-web-error-logs to 30d | | 1636810542649 | [2021/11/13 13:35:42] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Set retention policy to 30 | ...snip... --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudWatch Logsの設定も確認します。30日設定が入りました。
$ aws logs describe-log-groups --log-group-name-prefix /sample5-dev-web-error-logs --outpu table ------------------------------------------------------------------------------------------------------------- | DescribeLogGroups | +-----------------------------------------------------------------------------------------------------------+ || logGroups || |+-------------------+-------------------------------------------------------------------------------------+| || arn | arn:aws:logs:ap-northeast-1:123456789012:log-group:/sample5-dev-web-error-logs:* || || creationTime | 1636805554034 || || logGroupName | /sample5-dev-web-error-logs || || metricFilterCount| 0 || || retentionInDays | 30 || || storedBytes | 0 || |+-------------------+-------------------------------------------------------------------------------------+|
これでFluent Bitの設定通りの設定をロググループに設定できました。
まとめ
タスクロールの権限不足でログ期限設定に失敗しても、後からタスクロールに権限を追加し新たにFluent Bitコンテナを起動させれば、ロググループに設定追加(変更)できることがわかりました。既存のロググループを一度削除してから、再度Fluent Bitからロググループ自動生成し直しは必要ありませんでした。
おわりに
Flunet Bitの設定ファイルを編集後に起動したFluent Bitコンテナのログは必ずチェックしておいた方がよいという自戒でした。Fluent Bit起動時にまず設定ミスでエラーがないかログを見ておくと安心です。以下はエラーなく起動してきたFluent Bit v1.8.9の起動ログです。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | timestamp | message | |---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1636810552223 | [1mFluent Bit v1.8.9[0m | | 1636810552223 | * [1m[93mCopyright (C) 2019-2021 The Fluent Bit Authors[0m | | 1636810552223 | * [1m[93mCopyright (C) 2015-2018 Treasure Data[0m | | 1636810552223 | * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd | | 1636810552223 | * https://fluentbit.io | | 1636810552223 | [2021/11/13 13:35:52] [ info] [engine] started (pid=1) | | 1636810552223 | [2021/11/13 13:35:52] [ info] [storage] version=1.1.5, initializing... | | 1636810552224 | [2021/11/13 13:35:52] [ info] [storage] in-memory | | 1636810552224 | [2021/11/13 13:35:52] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128 | | 1636810552224 | [2021/11/13 13:35:52] [ info] [cmetrics] version=0.2.2 | | 1636810552224 | [2021/11/13 13:35:52] [ info] [input:tcp:tcp.0] listening on 127.0.0.1:8877 | | 1636810552224 | [2021/11/13 13:35:52] [ info] [input:forward:forward.1] listening on unix:///var/run/fluent.sock | | 1636810552224 | [2021/11/13 13:35:52] [ info] [input:forward:forward.2] listening on 127.0.0.1:24224 | | 1636810552414 | [2021/11/13 13:35:52] [ info] [sp] stream processor started | | 1636810981807 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Creating log group /sample5-dev-web-error-logs | | 1636810981847 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Log Group /sample5-dev-web-error-logs already exists | | 1636810981847 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Setting retention policy on log group /sample5-dev-web-error-logs to 30d | | 1636810981900 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Set retention policy to 30 | | 1636810981900 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Creating log stream fluentbit-error-a9c2f644a3c749b095a07dfe9b15e10c-265927825 in log group /sample5-dev-web-error-logs | | 1636810981928 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Created log stream fluentbit-error-a9c2f644a3c749b095a07dfe9b15e10c-265927825 | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ちなみにFluent Bitのログはログドライバーawslogs
でCloudWatch Logsへ送らています。ログルーティングするFluent Bit(FireLens)で自分自信のログをルーティングしたらトラブル時にデバッグできないですからね。